/*!
 * # 参数列表实体类:
 *  Create - 写入数据操作记录
 * 
 * # 描述:
 *  创建一条新的数据操作日志记录。
 *  
 *  Copyright (c), 上海沃恩信息科技有限公司.
 *  All rights reserved.
 *  Licensed under BSD (https://www.pittypat.work/bsd.html).
 */

using Pittypat;

namespace Waln.Log.Op.Args
{
	/// <summary>
	/// 功能 写入数据操作记录 的参数列表。
	/// </summary>
	[global::Pittypat.Function(Transaction = true)]
	public sealed class Create : global::Pittypat.FunctionArgs
	{
		#region 构造函数

		/// <summary>
		/// 初始化 Create 类的一个新实例。
		/// </summary>
		public Create()
		{
			// 用户 Id
			this.UserId = null;
			// 操作类型代码
			this.OpType = null;
			// 数据库表名称
			this.TableNames = null;
			// 存储过程名称
			this.ProcName = null;
			// 是否成功
			this.Success = null;
			// 操作摘要
			this.Summary = null;
			// 消息正文
			this.Body = null;
			// 消息 Id
			this.Id = null;
		}

		#endregion

		#region 属性

		/// <summary>
		/// 获取或者设置用户 Id。
		/// </summary>
		/// <remarks>
		/// 进行数据操作的目标用户的 Id，如果是系统操作，则为 null。
		/// </remarks>
		[global::Pittypat.Parameter(0, Role = global::Pittypat.ParameterRole.UserId)]
		public @uuid? UserId { get; set; }

		/// <summary>
		/// 获取或者设置操作类型代码。
		/// </summary>
		/// <remarks>
		/// 操作的类型代码：1-查询、2-添加、4-更新、8-删除、16-其他。
		/// </remarks>
		[global::Pittypat.Parameter(1)]
		public @int8? OpType { get; set; }

		/// <summary>
		/// 获取或者设置数据库表名称。
		/// </summary>
		/// <remarks>
		/// 所操作的目标数据库表的名称，多个之间使用 ',' 分隔。
		/// </remarks>
		[global::Pittypat.Parameter(2, MaxLength = 200)]
		public @string? TableNames { get; set; }

		/// <summary>
		/// 获取或者设置存储过程名称。
		/// </summary>
		/// <remarks>
		/// 执行操作的存储过程或函数的名称。
		/// </remarks>
		[global::Pittypat.Parameter(3, MaxLength = 128)]
		public @string? ProcName { get; set; }

		/// <summary>
		/// 获取或者设置是否成功。
		/// </summary>
		/// <remarks>
		/// 指示操作是否已经成功。
		/// </remarks>
		[global::Pittypat.Parameter(4)]
		public @bool? Success { get; set; }

		/// <summary>
		/// 获取或者设置操作摘要。
		/// </summary>
		/// <remarks>
		/// 操作的摘要信息。
		/// </remarks>
		[global::Pittypat.Parameter(5, MaxLength = 200)]
		public @string? Summary { get; set; }

		/// <summary>
		/// 获取或者设置消息正文。
		/// </summary>
		/// <remarks>
		/// 对数据库操作的详细说明信息。
		/// </remarks>
		[global::Pittypat.Parameter(6, MaxLength = 20000)]
		public @string? Body { get; set; }

		/// <summary>
		/// 获取或者设置消息 Id。
		/// </summary>
		/// <remarks>
		/// 日志消息的 Id。
		/// </remarks>
		[global::Pittypat.Parameter(7, Direction = global::Pittypat.ParameterDirection.Out)]
		public @int64? Id { get; set; }

		/// <summary>
		/// 获取或者设置指定名称的参数值。
		/// </summary>
		/// <param name="name">参数名称，不区分大小写。</param>
		/// <returns>目标名称的参数值。如果参数不存在，则返回 null。</returns>
		/// <exception cref="global::System.ArgumentException">设置参数值时发现参数不存在。</exception>
		public override object this[string name]
		{
			get
			{
				if (string.IsNullOrEmpty(name))
				{
					return null;
				}

				switch (name.ToLower())
				{
					case "userid":
						return this.UserId;
					case "optype":
						return this.OpType;
					case "tablenames":
						return this.TableNames;
					case "procname":
						return this.ProcName;
					case "success":
						return this.Success;
					case "summary":
						return this.Summary;
					case "body":
						return this.Body;
					case "id":
						return this.Id;
					default:
						return null;
				}
			}
			set
			{
				if (string.IsNullOrEmpty(name))
				{
					throw new global::System.ArgumentException("没有提供有效的参数名称。", "name");
				}

				switch (name.ToLower())
				{
					case "userid":
						this.UserId = (@uuid?)value;
						break;
					case "optype":
						this.OpType = (@int8?)value;
						break;
					case "tablenames":
						this.TableNames = (@string?)value;
						break;
					case "procname":
						this.ProcName = (@string?)value;
						break;
					case "success":
						this.Success = (@bool?)value;
						break;
					case "summary":
						this.Summary = (@string?)value;
						break;
					case "body":
						this.Body = (@string?)value;
						break;
					case "id":
						this.Id = (@int64?)value;
						break;
					default:
						throw new global::System.ArgumentException(name + " 不是 " + this.GetType().Name + " 的有效参数名称。", "name");
				}
			}
		}

		#endregion

		#region 方法

		/// <summary>
		/// 将当前对象作为 JSON 字符串写入指定的文本流。
		/// </summary>
		/// <param name="writer">目标文本流。</param>
		/// <exception cref="global::System.ArgumentNullException">writer 是 null。</exception>
		public override void Write(global::System.IO.TextWriter writer)
		{
			if (writer == null)
			{
				throw new global::System.ArgumentNullException("writer");
			}

			writer.Write('{');

			// 用户 Id
			writer.Write("\"userId\":");
			this.UserId.Write(writer);
			writer.Write(',');

			// 操作类型代码
			writer.Write("\"opType\":");
			this.OpType.Write(writer);
			writer.Write(',');

			// 数据库表名称
			writer.Write("\"tableNames\":");
			this.TableNames.Write(writer);
			writer.Write(',');

			// 存储过程名称
			writer.Write("\"procName\":");
			this.ProcName.Write(writer);
			writer.Write(',');

			// 是否成功
			writer.Write("\"success\":");
			this.Success.Write(writer);
			writer.Write(',');

			// 操作摘要
			writer.Write("\"summary\":");
			this.Summary.Write(writer);
			writer.Write(',');

			// 消息正文
			writer.Write("\"body\":");
			this.Body.Write(writer);
			writer.Write(',');

			// 消息 Id
			writer.Write("\"id\":");
			this.Id.Write(writer);

			writer.Write('}');
		}

		#endregion
	}
}
